package 第十二章多态;

/*
 *   关于java语言当中的多态语法机制：
 *       1、animal、cat、bird之间的关机
 *               cat、bird继承animal类
 *               cat和bird之间没有任何联系
 *
 *       2、面向对象三大特征：封装、继承、多态
 *
 *       3、关于多态中涉及到的几个概念：
 *           向上转型    upcasting       子类-->父类     自动类型转型
 *           向下转型    downcasting     父类-->子类     强制类型转换（需要加强制类型转换）
 *
 *       ****无论向上转型还是向下转型，两种类型之间必须要有继承关系，否则程序编译无法通过****
 *
 *
 *
 *
 *
 *
 * */
public class 多态测试 {
    public static void main(String[] args) {
        //之前的程序
        Animal a1 = new Animal();
        a1.move();
        cat c1 = new cat();
        c1.move();
        c1.catchmouse();
        bird b1 = new bird();
        b1.move();
        System.out.println('\n' + "*****************我是一条分割分割分割分割线********************" + '\n');
        //使用多态语法机制
        /*
         *   1、animal和cat之间存在继承关系，animal是父类，cat是子类
         *   2、cat is animal。
         *   3、new cat（）创建的对象类型是cat，a2这个引用的数据类型是animal，可见他们进行了类型转换
         *      子类型转换成了父类型，称为向上转型，或者称为自动类型转换，upcasting
         *  4、java中允许这种语法：父类型引用指向子类型的对象
         * */
        Animal a2 = new cat();

        /*
         * 1、java程序分为编译阶段和运行阶段
         * 2、编译无法通过，则无法运行
         * 3、编译阶段编译器检查a2这个引用的数据类型为animal，由于animal.class字节码
         *   当中拥有move（）方法，所以编译通过，这个过程称为***静态绑定***，编译阶段绑定
         *   只有静态绑定成功之后才有后续的运行
         * 4、在程序运行阶段，jvm堆内存当中真实创建的是cat对象，则程序在运行阶段一定会调用cat
         *    对象的move（）方法，此时发生了程序的动态绑定，运行阶段绑定
         *
         * */

        a2.move();          /*cat is walking，运行阶段 调用的一定是cat的move方法，
                                即使cat中没有move方法，
                                调用的也是cat从animal中继承的方法，
                                依旧属于cat中的方法*/
    }
}
